using System;
using System.Collections.Generic;
using System.Text;
using NEXEntidad;
using NEXServicio;

using System.Data;


namespace NEXEntidad
{
    #region Libro
    public class Libro : NEXEntidadElemento
    {
        #region Constructores
        public Libro(int id)
            : base(id)
        {
            this.Id = id;
        }
        public Libro(Guid guid, String titulo)
            : base()
        {
            this.GUId = guid;
            this.Titulo = titulo;
        }
        public Libro()
            : base()
        {
        }

        #endregion

        #region Campos/Propiedades

        /// <summary>
        /// Titulo del libro
        /// </summary>
        private String fTitulo;
        public String Titulo
        {
            get
            {
                return fTitulo;
            }
            set
            {
                fTitulo = value;
            }
        }

        /// <summary>
        /// Titulo original del libro.
        /// </summary>
        private String fTituloOriginal;
        public String TituloOriginal
        {
            get { return fTituloOriginal; }
            set { fTituloOriginal = value; }
        }

        /// <summary>
        /// Sintesis del libro
        /// </summary>
        private String fResumen;
        public String Resumen
        {
            get
            {
                return fResumen;
            }
            set
            {
                fResumen = value;
            }
        }

        /// <summary>
        /// ISBN unico del libro
        /// </summary>
        private String isbn;
        public String Isbn
        {
            get { return isbn; }
            set { isbn = value; }
        }

        /// <summary>
        /// Mensajes que se dejaron para este libro
        /// </summary>
        //private List<Mensaje> fMensajes;
        //public List<Mensaje> Mensajes
        //{
        //    get { return fMensajes; }
        //    set { fMensajes = value; }
        //}

        /// <summary>
        /// Ensayos que se subieron relacionados a este libro
        /// </summary>
        //private List<Ensayo> fEnsayos;
        //public List<Ensayo> Ensayos
        //{
        //    get { return fEnsayos; }
        //    set { fEnsayos = value; }
        //}

        /// <summary>
        /// Autor del libro
        /// </summary>
        private Autor fAutor;
        public Autor Autor
        {
            get
            {
                return fAutor;
            }
            set
            {
                fAutor = value;
            }
        }

        /// <summary>
        /// Categoria del libro (Terror, Suspense, etc)
        /// </summary>
        private Categoria fCategoria;
        public Categoria Categoria
        {
            get
            {
                return fCategoria;
            }
            set
            {
                fCategoria = value;
            }
        }

        private DateTime? fFechaPublicacion;
        public DateTime? FechaPublicacion
        {
            get
            {
                return fFechaPublicacion;
            }
            set
            {
                fFechaPublicacion = value;
            }
        }

        private Int32? fAnioPublicacion;
        public Int32? AnioPublicacion
        {
            get { return fAnioPublicacion; }
            set { fAnioPublicacion = value; }
        }

        /// <summary>
        /// Lista de temas a los que pertence el libro.
        /// </summary>
        private TemaCollection fTemas;
        public TemaCollection Temas
        {
            get { return fTemas; }
            set { fTemas = value; }
        }

       /// <summary>
        /// Lista de temas a los que pertence el libro.
        /// </summary>
        private TagCollection fTags;
        public TagCollection Tags
        {
            get { return fTags; }
            set { fTags = value; }
        }

        /// <summary>
        /// Editoriales que estan cargadas para este libro.
        /// </summary>
        private EditorialCollection fEditoriales;
        public EditorialCollection Editoriales
        {
            get { return fEditoriales; }
            set { fEditoriales = value; }
        }

        /// <summary>
        /// Comentarios asociados a este libro.
        /// No se identifica por ediciones, es el comentario
        /// para el libro, sin pertenecer a una edicion en particular
        /// </summary>
        private ComentarioCollection fComentarios;
        public ComentarioCollection Comentarios
        {
            get { return fComentarios; }
            set { fComentarios = value; }
        }

        
        private bool fActivo;
        public bool Activo
        {
            get { return fActivo; }
            set { fActivo = value; }
        }
        #endregion

        #region Metodos Publicos
        public static LibroCollection Listar()
        {
            return Libro.CrearListaCargada(ServicioLibro.Listar().Tables[ServicioLibro.DataTableName].Rows);
        }
        public static LibroCollection Listar(int? idAutor, string titulo)
        {
            return Libro.CrearListaCargada(ServicioLibro.Listar(idAutor, titulo).Tables[ServicioLibro.DataTableName].Rows);
        }
        public static LibroCollection Listar(bool completo)
        {
            return Libro.CrearListaCargada(ServicioLibro.Listar().Tables[ServicioLibro.DataTableName].Rows);
        }

        public static LibroCollection ListarPaginar(int? idAutor,string titulo,int registro,int cantidadReg)
        {
            return Libro.CrearListaCargada(ServicioLibro.ListarPaginar(idAutor,titulo,registro,cantidadReg).Tables[ServicioLibro.DataTableName].Rows);
        }

        #endregion

        #region Metodos de carga

        private static Libro CrearCargado(DataRow drLibro)
        {
            return CrearCargado(drLibro, false);
        }

        private static Libro CrearCargado(DataRow drLibro, bool completo)
        {
            try
            {
                Libro libro = new Libro();
                Libro.Cargar(libro, drLibro, false);
                if (completo)
                {
                    libro.fAutor = Autor.CrearCargadoCompleto(drLibro, true);
                    libro.fCategoria = Categoria.CrearCargadoCompleto(drLibro, true);
                }
                return libro;

            }
            catch (Exception ex)
            {
                throw;
            }
        }

        private static void Cargar(Libro libro, DataRow drLibro, Boolean completo)
        {
            libro.Id = Convert.ToInt32(drLibro["IdLibro"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            libro.Titulo = drLibro["Titulo"].ToString();
            libro.TituloOriginal = drLibro["Titulo_Original"].ToString();
            libro.Resumen = drLibro["Resumen"].ToString();
            libro.GUId = new Guid(drLibro["GuidLibro"].ToString());
            libro.Editoriales = Editorial.CrearListaUnElemento(drLibro);
            if (drLibro["AnioPublicacion"] != DBNull.Value)
                libro.AnioPublicacion = Convert.ToInt32(drLibro["AnioPublicacion"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            if (completo)
            {
                libro.fAutor = Autor.CrearCargadoCompleto(drLibro, true);
                libro.fCategoria = Categoria.CrearCargadoCompleto(drLibro, true);
                libro.Temas = Tema.ListarPorLibro(libro.Id);
                libro.Tags = Tag.ListarPorLibro(libro.Id);
                //SI EL SEGUNDO PARAMETRO DE COMENTARIO.LISTAR ES TRUE, ME LIMITA EL NUMERO DE COMENTARIO
                //QUE SE VAN A CARGAR EN LA LISTA GLOBAL gLista DE LA PAGINA FICHALIBRO.ASPX.
                libro.Comentarios = Comentario.Listar(libro.Id,false);
                // libro.Editoriales = Editorial.CrearListaUnElemento(drLibro);
            }
            else
            {
                libro.Autor = Autor.Crear(drLibro);
                libro.Categoria = Categoria.Crear(drLibro);
            }
            libro.ObjetoCargado();
        }

        private static LibroCollection CrearListaCargada(System.Data.DataRowCollection dataRowCollection)
        {
            LibroCollection libros = new LibroCollection();
            foreach (DataRow drLibro in dataRowCollection)
            {
                libros.Add(Libro.CrearCargado(drLibro, true));
            }
            return libros;
        }

        protected override void Obtener()
        {
            using (DataSet ds = ServicioLibro.Obtener(this.Id, this.GUId))
            {
                DataTable dtLibro = ds.Tables[ServicioLibro.DataTableName];
                if (dtLibro.Rows.Count > 0)
                {
                    DataRow drLibro = dtLibro.Rows[0];
                    Libro.Cargar(this, drLibro, true);
                }
                else
                {
                    throw new ObjetoInexistenteException("Libro");
                }
            }
        }

        #endregion

        #region Metodos para Salvar

        protected override int SalvarObjeto(NEX_Datos.Transaccion transaccion)
        {
            Int32 idLibro = ServicioLibro.Salvar(transaccion, this.Id, this.Titulo,this.TituloOriginal, this.Autor.Id, this.Resumen, this.Categoria.Id, this.FechaPublicacion, this.AnioPublicacion, this.Activo, this.EsInsert);
            return idLibro;
        }

        protected override void SalvarDependencias(NEX_Datos.Transaccion transaccion)
        {
            String valores = "";
            foreach (Tema unTema in this.Temas)
            {
                if (valores != "")
                    valores += ",";
                valores += "(" + this.Id + "," + unTema.Id + ")";

            }
            if (this.Temas.Count > 0)
                ServicioTema.SalvarTemaLibro(transaccion, this.Id, valores);

            valores = "";
            foreach (Tag unTag in this.Tags)
            {
                if (valores != "")
                    valores += ",";
                valores += "(" + this.Id + "," + unTag.Id + ")";

            }
            if (this.Tags.Count > 0)
                ServicioTag.SalvarTagLibro(transaccion, this.Id, valores);

            foreach (Editorial editorial in fEditoriales)
            {
                editorial.Libro = this;
                editorial.Salvar(transaccion);
            }
        }

        #endregion

        #region Metodos para eliminar

        protected override Boolean EliminarObjeto(NEX_Datos.Transaccion transaccion)
        {
            return ServicioLibro.Eliminar(transaccion, this.Id);
        }

        #endregion
    }
    #endregion

    #region LibroCollection

    [Serializable]
    public class LibroCollection : NEXCollection<Libro>
    {
    }

    #endregion
}
